﻿/*

Copyright 2010 OK HOSTING S.C.
info@okhosting.com
okhosting.com

La librería OKHOSTING.FacturaGratis es software gratuito: puede redistribuirlo 
y/o modificarlo de acuerdo a los términos expuestos en la licencia pública general 
GNU, publicada por la fundación de software libre (Free Software Foundation),
considerando la versión 3 de la licencia o cualquier otra superior.

OKHOSTING.FacturaGratis se distribuye con la esperanza de que le será de utilidad,
no obstante, no se ofrece garantía de ningun tipo, ni en el aspecto comercial o
de que la solución resulte adecuada a su negocio particular. Por favor revise la
licencia publica general GNU para mas información.

Usted debe haber recibido una copia de la licencia publica general GNU junto con 
la librería OKHOSTING.FacturaGratis, pero en caso contrario lo invitamos a que 
revise http://www.gnu.org/licenses/

******************************************************************************
OKHOSTING.FacturaGratis library is free software: you can redistribute 
it and/or modify it under the terms of the GNU General Public License as 
published by the Free Software Foundation, either version 3 of the License, 
or any later version.

OKHOSTING.FacturaGratis is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 
or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for 
more details.

You should have received a copy of the GNU General Public License along with 
OKHOSTING.FacturaGratis Library.  If not, see <http://www.gnu.org/licenses/>.

*/

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;

namespace OKHOSTING.FacturaGratis
{
	/// <summary>
	/// Empresa que puede ser usada como Emisor o Receptor dentro de una factura
	/// </summary>
	[Serializable]
	public struct Empresa
    {

        #region Constructor

        /// <summary>
        /// Construye la estructura
        /// </summary>
        /// <param name="Nombre">
        /// Razón Social de la empresa
        /// </param>
        /// <param name="RFC">
        /// Registro Federal de Constribuyentes de la empresa, sin guiones ni espacios, todo con mayúsculas
        /// </param>
        public Empresa(
            string Nombre,
            string RFC)
        {
            //Validando RFC
            Empresa.ValidateRFC(RFC.Trim().ToUpper());

            //Inicializando miembros
            this.Nombre = Nombre;
            this.rFC = RFC;
        }

        #endregion

        #region Campos

        /// <summary>
		/// Razón Social de la empresa
		/// </summary>
		public string Nombre;

		/// <summary>
		/// Registro Federal de Constribuyentes de la empresa, sin guiones ni espacios, todo con mayúsculas
		/// </summary>
		private string rFC;

        /// <summary>
        /// Registro Federal de Constribuyentes de la empresa, sin guiones ni espacios, todo con mayúsculas
        /// </summary>
        public string RFC 
        {
            get { return this.rFC; }
            set 
            {
                //Validando RFC
                Empresa.ValidateRFC(value.Trim().ToUpper());

                //Asignando el valor en mayusculas
                this.rFC = value.Trim().ToUpper();
            }
        }

        /// <summary>
        /// Valida el RFC indicado
        /// </summary>
        /// <param name="RFC">
        /// RFC a validar
        /// </param>
        private static void ValidateRFC(string RFC)
        {
            //Validando que el RFC tenga solo letras y números ()
            Regex regex = new Regex("[ABCDEFGHIJKLMNÑOPQRSTUVWXYZ0123456789]");
            if (regex.IsMatch(RFC))
                throw new ArgumentException(
                    "El RFC debe tener solo letras y números, y debe tener una longitud de 10 o 13 caracteres (con o sin homoclave)",
                    "RFC(value)");

            //Validando que el RFC tenga 10 o 13 caracteres (con o sin homoclave)
            if (RFC.Length != 10 && RFC.Length != 13)
                throw new ArgumentException(
                    "El RFC debe tener solo letras y números, y debe tener una longitud de 10 o 13 caracteres (con o sin homoclave)",
                    "RFC(value)");
        }

        #endregion

    }
}